package org.example.myleet.p476;

public class Solution {
    /**
     * 模拟+位运算
     */
    public int findComplement(int num) {
        //记录32位有符号整数中所有位置是0还是1
        boolean[] bits = new boolean[31];
        //记录数字中1的最高位置，即最高有效位置
        int bitCount = 0;
        for (int i = 0; i < 31; ++i) {
            if (num == 0) {
                //已经超过数字最高位的1，结束
                break;
            }
            //记录位置是0还是1，然后右移以剔掉最后一位
            bits[i] = (num & 1) != 0;
            num >>= 1;
            ++bitCount;
        }
        //对所有有效位置进行翻转
        for (int i = bitCount - 1; i >= 0; --i) {
            bits[i] = !bits[i];
        }
        //将记录的bits还原到result中输出
        int result = 0;
        for (int i = bitCount - 1; i >= 0; --i) {
            result <<= 1;
            if (bits[i]) {
                result += 1;
            }
        }
        return result;
    }
}
